/**
 * 日志系统类型定义
 *
 * @fileoverview 定义日志系统的核心类型和枚举，包括结构化日志格式、
 * 日志分类、日志级别等。
 */

/**
 * 日志分类枚举
 *
 * @description 用于对日志进行分类，便于过滤、分析和存储
 */
export enum LogCategory {
  // 业务日志
  BOOKING = 'booking', // 预约流程
  MONITOR = 'monitor', // 监控任务
  BATCH = 'batch', // 批量操作

  // 技术日志
  HTTP = 'http', // HTTP请求
  DATABASE = 'database', // 数据库操作
  IPC = 'ipc', // IPC通信
  WORKER = 'worker', // Worker进程

  // 系统日志
  SYSTEM = 'system', // 系统级
  PERFORMANCE = 'performance', // 性能监控
  SECURITY = 'security', // 安全相关

  // 第三方
  BROWSER = 'browser', // 浏览器操作
  PROXY = 'proxy', // 代理相关
}

/**
 * 日志级别
 */
export type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'

/**
 * UI日志级别（简化版，面向用户）
 */
export type UserLogLevel = 'user-info' | 'user-warn' | 'user-error'

/**
 * 结构化日志接口
 *
 * @description 标准的日志格式，确保所有日志都有统一的结构
 * 便于分析、检索和追踪
 */
export interface StructuredLog {
  /** 时间戳（ISO 8601格式） */
  timestamp: string
  /** 日志级别 */
  level: LogLevel
  /** 日志消息 */
  message: string
  /** 追踪ID（用于追踪完整请求链路） */
  traceId: string
  /** 关联ID（用于关联相关操作） */
  correlationId?: string
  /** 当前步骤ID（用于嵌套操作追踪） */
  spanId?: string
  /** 父步骤ID */
  parentSpanId?: string
  /** 会话ID */
  sessionId?: string
  /** 组件名称 */
  component: string
  /** 日志分类 */
  category: LogCategory
  /** 操作名称 */
  operation?: string
  /** 用户ID */
  userId?: string
  /** 用户名称 */
  userName?: string
  /** 护照号码（脱敏后） */
  passport?: string
  /** 耗时（毫秒） */
  duration?: number
  /** 错误信息（仅错误日志） */
  error?: {
    name: string
    message: string
    stack?: string
    code?: string
  }
  /** 元数据（额外的上下文信息） */
  metadata?: Record<string, any>
}

/**
 * UI层日志格式（存储在Job表）
 *
 * @description 面向用户的日志格式，简洁明了，便于在UI中展示
 */
export interface UserLog {
  /** 时间戳（Unix秒） */
  timestamp: number
  /** UI日志级别 */
  level: UserLogLevel
  /** 用户友好的消息文本 */
  message: string
  /** 步骤名称（可选） */
  step?: string
  /** 进度百分比（0-100，可选） */
  progress?: number
  /** 详细信息（可选，可折叠展示） */
  details?: {
    /** 错误信息（如果有） */
    error?: string
    /** 处理建议（如果有） */
    suggestion?: string
    /** 其他数据 */
    data?: any
  }
}

/**
 * 日志上下文接口
 *
 * @description 定义日志记录时可以包含的上下文信息
 */
export interface LogContext {
  /** 会话ID */
  sessionId?: string
  /** 用户ID */
  userId?: string
  /** 操作名称 */
  operation?: string
  /** 执行时长（毫秒） */
  duration?: number
  /** HTTP状态码 */
  httpStatus?: number
  /** 请求URL */
  url?: string
  /** 用户代理字符串 */
  userAgent?: string
  /** IP地址 */
  ip?: string
  /** 请求ID */
  requestId?: string
  /** 组件名称 */
  component?: string
  /** 方法名称 */
  method?: string
  /** 追踪ID */
  traceId?: string
  /** 关联ID */
  correlationId?: string
  /** 用户操作描述 */
  user_action?: string
  /** 恢复建议 */
  recovery_suggestion?: string
  /** 日志分类 */
  category?: LogCategory
  /** 其他自定义字段 */
  [key: string]: any
}
